package homework5;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * 作业五：使用集合实现斗地主游戏的部分功能，要求如下：
 * （1）首先准备 54 张扑克牌并打乱顺序。
 * （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
 * （3）查看三个玩家手中的扑克牌和底牌。
 * （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
 * 手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
 */
public class FightAgainstLandlords {
	//1、准备牌
	//创建一个Map集合，存储牌的索引和牌
	HashMap<Integer, String> poker = new HashMap<>();
	//创建一个List集合，存储牌的索引，也就是上边Map集合中的key值
	ArrayList<Integer> pokerIndex = new ArrayList<>();
	//定义两个集合，一个用来存储花色，一个用来存储牌的序号
	List<String> colors = List.of("♠", "♥", "♦", "♣");
	List<String> numbers = List.of("2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
	//定义4个集合，存储玩家牌的索引和底牌的索引
	ArrayList<Integer> player1 = new ArrayList<>();
	ArrayList<Integer> player2 = new ArrayList<>();
	ArrayList<Integer> player3 = new ArrayList<>();
	ArrayList<Integer> diPai = new ArrayList<>();

	private void play() {
		//将大王和小王存储到集合中
		int index = 0;                  //定义一个键的索引
		poker.put(index, "大王");        //添加大王到集合的0索引
		pokerIndex.add(index);
		index++;
		poker.put(index, "小王");        //添加小王到集合的1索引
		pokerIndex.add(index);
		index++;

		//采用双重 foreach 来循环遍历两个集合，将花牌和序号进行拼接，组成54张牌，并添加到 poker 集合中
		for (String number : numbers) {
			for (String color : colors) {
				poker.put(index, color + number);     //从2索引开始添加牌
				pokerIndex.add(index);                //每加一张牌，便把该牌的索引也加到集合中
				index++;
			}
		}

		//2、洗牌  将牌的索引顺序打乱
		Collections.shuffle(pokerIndex);

		//3、发牌
		//遍历索引集合，获取每一张牌的索引
		for (int i = 0; i < pokerIndex.size(); i++) {
			Integer in = pokerIndex.get(i);
			//先判断底牌
			if (i >= 51) {    //最后三张为底牌
				//给底牌发牌
				diPai.add(in);
			} else if (i % 3 == 0) {    //给玩家1发牌
				player1.add(in);
			} else if (i % 3 == 1) {    //给玩家2发牌
				player2.add(in);
			} else if (i % 3 == 2) {    //给玩家3发牌
				player3.add(in);
			}
		}

		//4、排序
		Collections.sort(player1);
		Collections.sort(player2);
		Collections.sort(player3);
		Collections.sort(diPai);
	}


	//看牌
	private void lookPoker(String name, HashMap<Integer, String> poker, ArrayList<Integer> list) {
		System.out.print(name + ": ");
		//获取牌的索引
		for (Integer key : list) {
			String value = poker.get(key);
			System.out.print(value + " ");
		}
		System.out.println();         //打印完每个玩家进行换行
	}

	public void show() {
		play();
		//5、看牌
		lookPoker("灭霸手牌是", poker, player1);
		lookPoker("雷神手牌是", poker, player2);
		lookPoker("美队手牌是", poker, player3);
		lookPoker("底牌是", poker, diPai);
	}
}
